<?php

Yii::import('application.modules.carta.models._base.BaseCartaAlimentos');

/**
 * Modelo (heredado) para la tabla cartaAlimentos
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 */
class CartaAlimentos extends BaseCartaAlimentos {

    /**
     * @return CartaAlimentos
     */
    public $tipoCarta;
    public $nombreTipoCarta;
    public $descripcionTipoCarta;

    /**
     * Constructor
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec> 
     * @param type $className
     * @return type
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    /**
     * Funcion que muestra el nombre general para el modelo
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param type $n
     * @return type
     */
    public static function label($n = 1) {
        return Yii::t('app', 'Alimentos de men&uacute;|Alimentos de men&uacute;s', $n);
    }

    /**
     * Funcion que permite mostrar los nombres de tablas y atributos del modelo
     * de una manera mas amigable
     * @return type
     * @author  Mauricio Chamorro <mrchamorro@utn.edu.ec>
     */
    public function attributeLabels() {
        return array(
            'id' => Yii::t('app', 'ID'),
            'carta_nutricional_id' => Yii::t('app', 'Menú'),
            'alimentos_id' => Yii::t('app', 'Alimentos'),
            'cartaNutricional' => null,
            'alimentos' => null,
            'tipoCarta' => Yii::t("app", 'Tiempo de comida'),
            'nombreTipoCarta' => Yii::t("app", 'Nombre menú'),
            'descripcionTipoCarta' => Yii::t("app", 'Descripción menú'),
        );
    }

    /**
     * Permite validar el formulario con las reglas que se indican
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @return type
     */
    public function rules() {
        return array_merge(
                parent::rules(), array(
            array('carta_nutricional_id, alimentos_id, medida, variantes_carta_id, edades_id, tipoCarta, nombreTipoCarta', 'required'),
//            array('nombreTipoCarta', 'unique'),
            array('id, carta_nutricional_id, alimentos_id, cantidad, medida, variantes_carta_id, edades_id, descripcionTipoCarta', 'safe', 'on' => 'search'),
        ));
    }

    /**
     * Recupera la cartaAlimento que pertenesca a una carta nutricional
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param type $id
     * @return \CartaAlimentos
     */
    public function de_menu_id($id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.carta_nutricional_id=:carta_nutricional_id',
                    'params' => array(
                        ':carta_nutricional_id' => $id,
                    )
                )
        );
        return $this;
    }

    /**
     * Recupera la carta alimentos segun la carta nutricional y el alimento
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * @param type $idCartaNutricional
     * @param type $idAlimento
     * @return \CartaAlimentos
     */
    public function de_menu_alimento_id($idCartaNutricional, $idAlimento) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.carta_nutricional_id=:carta_nutricional_id AND t.alimentos_id=:alimentos_id',
                    'params' => array(
                        ':carta_nutricional_id' => $idCartaNutricional,
                        ':alimentos_id' => $idAlimento,
                    )
                )
        );
        return $this;
    }

    /**
     * Permite recuperar las cartas de alimentos de acuerdo al id de la carta nutricional
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * @param type $idCartaNutricional
     * @return \CartaAlimentos
     */
    public function de_carta_nutricional_id($idCartaNutricional) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.carta_nutricional_id=:carta_nutricional_id',
                    'params' => array(
                        ':carta_nutricional_id' => $idCartaNutricional,
                    )
                )
        );
        return $this;
    }

    /**
     * Consulta SQL para obtener los alimentos del menu con sus respectivos valores nutricionales y porciones
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $carta_nut_id
     * @return array
     */
    public function consultaValoresNutricionalesMenuAlimentos($carta_nut_id) {
        $command = Yii::app()->db->createCommand()
                ->select('al.nombre as nombreAlimento, ca.cantidad as cantidad, vn.*')
                ->from('carta_nutricional cn')
                ->leftJoin('carta_alimentos ca', 'ca.carta_nutricional_id=cn.id')
                ->leftJoin('alimentos al', 'ca.alimentos_id = al.id')
                ->leftJoin('valores_nutricionales vn', 'al.id=vn.alimentos_id')
                ->where('cn.id = :carta_nut_id', array(':carta_nut_id' => $carta_nut_id));
        $result = $command->queryAll();
        if (!empty($result)) {
            return $result;
        } else {
            return null;
        }
    }

    /**
     * Funcion que permite generar la grafica para mostrar los valores nutricionales del menu
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $idMenu
     */
    public function reportSumValNutMenuAlimentos($idMenu) {
        $respInit = $this->totalValoresNutricionalesDiarios($idMenu);
        $report = array();
        $report['xAxis']['categories'] = array();
        $report['series'] = array();
        $report['series'][0]['type'] = 'column';
        $nombresValN = array();
        foreach ($respInit as $key => $value) {
            $val = Util::getCambioNombreValNutricional($key) . ' ' . Util::getMedidasValoresNutricionales($key);
            $nombresValN[$val] = $val;
        }
        $report['xAxis']['categories'] = array_keys($nombresValN);
        $report['series'][0]['name'] = "Valor Nutrimental";
        $report['series'][0]['data'] = array_values($respInit);
        $report['value']['max'] = max($report['series'][0]['data']);
        $report['value']['min'] = min($report['series'][0]['data']);

        return $report;
    }

    /**
     * Calcula los valores nutricionales del menu dependiendo del alimento y de la porcion
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $idMenu 
     * @return array key:valor nutricional   value:cantidad
     */
    public function totalValoresNutricionalesDiarios($idMenu) {
        $data = $this->consultaValoresNutricionalesMenuAlimentos($idMenu);
        $valoresNutricionalesTotal = array();
        $cantidadValoresNutricionalesTotal = array();
        $nombresValoresNutricionales = array();
        $cantidadValoresNutricionales = array();
        foreach ($data as $key => $alimento) {
            $cantidadAlimento = $alimento['cantidad'];
            unset($alimento['cantidad']);
            unset($alimento['nombreAlimento']);
            unset($alimento['id']);
            unset($alimento['alimentos_id']);
            if ($key == 0) {
                $nombresValoresNutricionales = array_fill_keys(array_keys($alimento), 0);
                $cantidadValoresNutricionalesTotal = array_values($nombresValoresNutricionales);
            }
            $cantidadValoresNutricionales = array_values($alimento);
            if ($cantidadAlimento != "100.00") {
                foreach ($cantidadValoresNutricionales as $key => &$cantidadValorNutricional) {
                    $cantidadValorNutricional = $cantidadValorNutricional * $cantidadAlimento / 100;
                }
            } else {
                foreach ($cantidadValoresNutricionales as $key => &$cantidadValorNutricional) {
                    $cantidadValorNutricional = $cantidadValorNutricional;
                }
            }
            for ($i = 0; $i < sizeof($cantidadValoresNutricionales); $i++) {
                $cantidadValoresNutricionalesTotal[$i]+= $cantidadValoresNutricionales[$i];
            }
        }
        $valoresNutricionalesTotal = array_combine(array_keys($nombresValoresNutricionales), $cantidadValoresNutricionalesTotal);


        foreach ($valoresNutricionalesTotal as $key => &$value) {
            if ($key == 'proteinas_g' ||
                    $key == 'carbohidratos_g') {
                $value = round($value * 4, 2);
            } else if ($key == 'grasa_total_g' ||
                    $key == 'acidos_grasos_monoinsat_g' ||
                    $key == 'acidos_grasos_poliinsaturad_g' ||
                    $key == 'acidos_grasos_saturados_g'
            ) {
                $value = round($value * 9, 2);
            } else {
                $value = round($value, 2);
            }
        }
        return $valoresNutricionalesTotal;
    }

    /**
     * Function busca el menu al que pertenece 
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * @param type $id id de la cartaNutricional
     * @return String  descripcion del tiempo de la edad
     */
    public function de_edad_id($id) {
//        var_dump($id);
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.carta_nutricional_id=:carta_nutricional_id',
                    'params' => array(
                        ':carta_nutricional_id' => $id,
                    )
                )
        );
        $x = $this->findAll();
//        var_dump($x);
//        die();
        $edadDescrita = $x[0]['oldValues']['edades_id'];
        $edad = Edades::model()->findByPk((int) $edadDescrita);
        return ($edad['oldValues']['tiempo']);
    }

    /**
     * @author Sofia Mejia <asmejia@utn.edu.ec>
     * function que permite buscar y colocar en un arreglo los alimentos que 
     * pertenecen a ese menu con su respectivo tiempo de comida
     * @param int $id_menu id del menu seleccionado
     */
    public function alimentos_de_menu($id_menu) {
        $valoresAlimentos = $this->de_menu_id($id_menu)->findAll();
        $menu = array();
        $medida_alimento = array();
        $cantidad_alimento = array();
        $alimentos_menu = array();
        $variante_menu = array();
        $data = array();
        if (isset($valoresAlimentos)) {
            foreach ($valoresAlimentos as $value) {
                $variante = $value->variantesCarta;
                if (isset($variante)) {
                    array_push($variante_menu, $variante['oldValues']['representacion']);
                }
                $alimento = $value->alimentos;
                if (isset($alimento)) {
                    $complemento = $alimento['oldValues']['nombre'] . " " . $alimento['oldValues']['descripcion'];
                    array_push($alimentos_menu, $complemento);
                }
                $medida = $value->medida;
                if (isset($medida)) {
                    array_push($medida_alimento, $medida);
                }
                $cantidad = $value->cantidad;
                if (isset($cantidad)) {
                    array_push($cantidad_alimento, $cantidad);
                }
                array_push($menu, array($variante['oldValues']['representacion'], $complemento, $medida, $cantidad));
            }
        }
        return $menu;
    }

    /**
     * Permite validar o guardar el alimento de un menu deacuerdo al primer atributo
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $idCartaNut si es null, valida, casocontrario guarda
     * @param array $value
     * @param int $variante
     * @param array $_POST_CartaAlimentos
     * @return model
     */
    public function validateOrSaveAlimentoMenu( $idCartaNut=null, $value, $variante, $_POST_CartaAlimentos) {//todo
        $model = new CartaAlimentos;
        $model->carta_nutricional_id = $idCartaNut!=null?$idCartaNut:1;
        $model->edades_id = $_POST_CartaAlimentos['edades_id'];
        $model->alimentos_id = $value['alimentos_id'];
        $model->cantidad = $value['cantidad'];
        $model->medida = $value['medida'];
        $model->variantes_carta_id = $variante;
        $model->nombreTipoCarta = $_POST_CartaAlimentos['nombreTipoCarta'];
        $model->descripcionTipoCarta = $_POST_CartaAlimentos['descripcionTipoCarta'];
        $model->tipoCarta = $_POST_CartaAlimentos['tipoCarta'];
        return $idCartaNut!=null?$model->save():$model->validate();
    }

    
    /**
     * Permite actuaizar los alimentos de un menu
     * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
     * @param int $idCartaNut id de la carta nutricinal
     * @param array $value('alimentos_id','cantidad','medida')
     * @param int $variante el id de variante_carta
     * @param array $_POST_CartaAlimentos
     * @return boolean
     */
    public function updateAlimentoMenu($idCartaNut, $value, $variante, $_POST_CartaAlimentos, $validate = true) {
        $result = $this->de_menu_alimento_id($idCartaNut, $value['alimentos_id'])->findAll();
        $model = new CartaAlimentos;
        if (empty($result)) {
//            diferentes alimentos 
            $result = $this->de_carta_nutricional_id($idCartaNut)->findAll();
            foreach ($result as $key => $dato) {
                if ($dato->variantes_carta_id == $variante) {
                    $model = CartaAlimentos::model()->findByPk((int)$dato->id);
                    $model->alimentos_id = $value['alimentos_id'];
                    $model->cantidad = $value['cantidad'];
                    $model->medida = $value['medida'];
                    $model->nombreTipoCarta = $_POST_CartaAlimentos['nombreTipoCarta'];
                    $model->descripcionTipoCarta = $_POST_CartaAlimentos['descripcionTipoCarta'];
                    $model->tipoCarta = $_POST_CartaAlimentos['tipoCarta'];
                    return $validate == true ? $model->validate() : $model->save();
                }
            }
        } else {
            //mismo alimento
            $model = CartaAlimentos::model()->findByPk((int) $result[0]['oldValues']['id']);
            if ($model->variantes_carta_id == $variante) { //misma variante
                $model->alimentos_id = $value['alimentos_id'];
                $model->cantidad = $value['cantidad'];
                $model->medida = $value['medida'];
                $model->nombreTipoCarta = $_POST_CartaAlimentos['nombreTipoCarta'];
                $model->descripcionTipoCarta = $_POST_CartaAlimentos['descripcionTipoCarta'];
                $model->tipoCarta = $_POST_CartaAlimentos['tipoCarta'];
                return $validate == true ? $model->validate() : $model->save();
            } else { // mismo alimento y diferente variante
                $model->alimentos_id = $value['alimentos_id'];
                $model->cantidad = $value['cantidad'];
                $model->medida = $value['medida'];
                $model->variantes_carta_id = $variante;
                $model->nombreTipoCarta = $_POST_CartaAlimentos['nombreTipoCarta'];
                $model->descripcionTipoCarta = $_POST_CartaAlimentos['descripcionTipoCarta'];
                $model->tipoCarta = $_POST_CartaAlimentos['tipoCarta'];
                return $validate == true ? $model->validate() : $model->save();
            }
        }
    }
    
//       public function behaviors() {
//        return array(
//            'ActiveRecordLogableBehavior' => array('class' =>
//                'application.behaviors.ActiveRecordLogableBehavior'),
//        );
//    }

}
